home *** CD-ROM | disk | FTP | other *** search
/ PD ROM 1 / PD ROM Volume I - Macintosh Software from BMUG (1988).iso / Fonts / PostScript® Samples / Escher’s Fish.postscript < prev    next >
Encoding:
Text File  |  1987-01-31  |  6.8 KB  |  279 lines  |  [TEXT/ttxt]

  1. % "Square Limit" drawing by M. C. Escher
  2. % Functions derived by Peter Henderson
  3. % Paper in 1982 Conference on LISP and Functional Programming
  4. % Coding by Michael Parsons, Sept. 1985
  5. % Translation to PostScript for Sun CRT by Peter Bumbulis, July 1986
  6. % Adaptation for Apple LaserWriter by Price Collins, Jan. 1988
  7.  
  8. % corner defines one corner of the picture at level n
  9. /corner
  10.   { dup 0 le
  11.       {   pop        { }       { }        { } u quartet }
  12.       { 1 sub dup corner exch side dup 90 rot u quartet }
  13.     ifelse
  14.   } def
  15.  
  16. % cycle combines 4 copies of image each rotated by 90 degrees
  17. /cycle
  18.   { dup 270 rot
  19.     dup 180 rot
  20.     dup 90 rot
  21.     quartet
  22.   } def
  23.  
  24. % fish gives a border to produce the final drawing
  25. /fish
  26.   { squarelimit exec
  27.     newpath  
  28.       0 0 moveto
  29.       0 1 lineto
  30.       1 1 lineto
  31.       1 0 lineto
  32.     closepath
  33.     stroke
  34.   } def
  35.  
  36. % flip inverts the image
  37. /flip
  38.   { .5 .5 translate
  39.     1 -1 scale
  40.     -.5 -.5 translate
  41.   } def
  42.  
  43. % nonet arranges 9 images in equal sized squares to form 1 image
  44. /nonet
  45.   { 9 -1 roll 1 3 div 0  1  zoom
  46.     9 -1 roll 1 3 div .5 1  zoom
  47.     9 -1 roll 1 3 div 1  1  zoom
  48.     9 -1 roll 1 3 div 0  .5 zoom
  49.     9 -1 roll 1 3 div .5 .5 zoom
  50.     9 -1 roll 1 3 div 1  .5 zoom
  51.     9 -1 roll 1 3 div 0  0  zoom
  52.     9 -1 roll 1 3 div .5 0  zoom
  53.     9 -1 roll 1 3 div 1  0  zoom
  54.     9 { exec } /repeat cvx 12 array astore cvx
  55.   } def
  56.  
  57. % quadcorner forms 1 quarter of the image at level n.
  58. /quadcorner
  59.   { dup corner
  60.     exch side
  61.     dup dup
  62.     90 rot
  63.     dup u
  64.     exch t
  65.     90 rot
  66.     dup 3 1 roll
  67.     { q }
  68.     90 rot
  69.     nonet
  70.   } def
  71.  
  72. % quartet combines 4 images, 1 in each quadrant, to produce 1 image
  73. /quartet
  74.   { 4 -1 roll 1 2 div 0 1 zoom
  75.     4 -1 roll 1 2 div 1 1 zoom
  76.     4 -1 roll 1 2 div 0 0 zoom
  77.     4 -1 roll 1 2 div 1 0 zoom
  78.     4 { exec } /repeat cvx 7 array astore cvx
  79.   } def
  80.  
  81. % rot rotates image by the radians anti-clockwise about the image center
  82. /rotcode
  83.   { gsave
  84.      .5 .5 translate
  85.       rotate
  86.       -.5 -.5 translate
  87.       exec
  88.     grestore
  89.   } def
  90. /rot { /rotcode cvx 3 array astore cvx } def
  91.  
  92. % side defines one side of the picture at level n
  93. /side
  94.   { dup 0 le
  95.       {   pop  { } dup t 90 rot t quartet }
  96.       { 1 sub side dup t 90 rot t quartet }
  97.     ifelse
  98.   } def
  99.  
  100. % squarelimit produces the fish drawing
  101. /squarelimit { quadcorner cycle } def
  102.  
  103. % zoom scales an image up or down with one fixed point
  104. /zoomcode
  105.   { gsave
  106.       2 copy neg exch neg exch 5 2 roll translate
  107.       dup scale translate
  108.       exec
  109.     grestore
  110.   } def
  111. /zoom { /zoomcode cvx 5 array astore cvx } def
  112.  
  113. % p, q, r and s are the data needed to draw the fish
  114. /p
  115.   { gsave
  116.       flip
  117.       .0625 .0625 scale
  118.       newpath
  119.        3 12 moveto  0  8 lineto
  120.                     0 13 lineto
  121.                     3 12 lineto
  122.        4 12 moveto  6 16 lineto
  123.        7 10 moveto  4 11 lineto
  124.                     4  6 lineto
  125.                     7 10 lineto
  126.        8  4 moveto 16  6 lineto
  127.        8  8 moveto 10 12 lineto
  128.                    13 11 lineto
  129.                    16 12 lineto
  130.        9 10 moveto 12  9 lineto
  131.                    16 10 lineto
  132.       10  0 moveto 12  2 lineto
  133.                    16  3 lineto
  134.       10 12 moveto 11 16 lineto
  135.                    14 14 lineto
  136.                    16 14 lineto
  137.       12  0 moveto 13  1 lineto
  138.                    16  2 lineto
  139.       14  0 moveto 16  1 lineto
  140.       16  4 moveto 12  4 lineto
  141.                     8  0 lineto
  142.                     6  1 lineto
  143.                     0  0 lineto
  144.                     4  3 lineto
  145.                     8  8 lineto
  146.                    12  7 lineto
  147.                    16  8 lineto
  148.       stroke
  149.     grestore
  150.   } def
  151.  
  152. /q
  153.   { gsave
  154.       flip
  155.       .0625 .0625 scale
  156.       newpath
  157.        0  0 moveto  0  4 lineto
  158.                     3  3 lineto
  159.                     5  2 lineto
  160.                     4  0 lineto
  161.        0  6 moveto  7  5 lineto
  162.        2  0 moveto  3  3 lineto
  163.        2 16 moveto  4 11 lineto
  164.                     4  9 lineto
  165.                     6  9 lineto
  166.        4  9 moveto  0  8 lineto
  167.                     0 16 lineto
  168.                     8 16 lineto
  169.                    10 10 lineto
  170.                    10  7 lineto
  171.        4 16 moveto  6 11 lineto
  172.                     6  9 lineto
  173.                    12  6 lineto
  174.                    16  0 lineto
  175.                    15  6 lineto
  176.                    16  8 lineto
  177.                    13 12 lineto
  178.                    12 16 lineto
  179.                    16 16 lineto
  180.        5  2 moveto  7  1 lineto
  181.                     8  0 lineto
  182.        6  0 moveto  7  1 lineto
  183.        6 16 moveto  8 11 lineto
  184.        8  1 moveto 11  1 lineto
  185.                     9  3 lineto
  186.                     8  1 lineto
  187.        8 11 moveto  8  8 lineto
  188.        9  4 moveto 12  4 lineto
  189.                    10  6 lineto
  190.                     9  4 lineto
  191.       10 16 moveto 14  5 lineto
  192.       13 16 moveto 16 10 lineto
  193.       14 16 moveto 16 12 lineto
  194.       15 16 moveto 16 14 lineto
  195.       stroke
  196.     grestore
  197.   } def
  198.  
  199. /r
  200.   { gsave
  201.       flip
  202.       .0625 .0625 scale
  203.       newpath
  204.        0  4 moveto  1  2 lineto
  205.        0  8 moveto  2  4 lineto
  206.        0 12 moveto  5  6 lineto
  207.        0 16 moveto  8  8 lineto
  208.        1 15 moveto  4 16 lineto
  209.        2 14 moveto  8 16 lineto
  210.        3 13 moveto  8 14 lineto
  211.                    12 16 lineto
  212.        5 11 moveto 12 13 lineto
  213.                    16 16 lineto
  214.        6  0 moveto 11  6 lineto
  215.                    16 10 lineto
  216.       11  0 moveto 12  4 lineto
  217.                    16  8 lineto
  218.       12  4 moveto 16  0 lineto
  219.       15  1 moveto 16  2 lineto
  220.       14  2 moveto 16  4 lineto
  221.       13  3 moveto 16  6 lineto
  222.       16 12 moveto 14 10 lineto
  223.                     8  8 lineto
  224.                     2  4 lineto
  225.                     0  0 lineto
  226.       stroke
  227.     grestore
  228.   } def
  229.  
  230. /s
  231.   { gsave
  232.       flip
  233.       .0625 .0625 scale
  234.       newpath
  235.        0 16 moveto  4 14 lineto
  236.                     8 14 lineto
  237.                    16 16 lineto
  238.                    10 12 lineto
  239.                     8 10 lineto
  240.                     7  8 lineto
  241.                     7  3 lineto
  242.                     8  0 lineto
  243.        0  2 moveto  7  3 lineto
  244.        0  4 moveto  7  6 lineto
  245.        0  6 moveto  7  8 lineto
  246.        0  8 moveto  8 10 lineto
  247.        0 10 moveto  7 12 lineto
  248.        0 12 moveto  2 15 lineto
  249.       10  0 moveto 11  6 lineto
  250.       12  0 moveto 13  3 lineto
  251.       12 12 moveto 12  9 lineto
  252.                    10 10 lineto
  253.                    12 12 lineto
  254.       14  5 moveto 16  4 lineto
  255.       15  7 moveto 13  3 lineto
  256.                    16  2 lineto
  257.       15 11 moveto 15  8 lineto
  258.                    13  9 lineto
  259.                    15 11 lineto
  260.       16  6 moveto 15  7 lineto
  261.                    16  8 lineto
  262.       stroke
  263.     grestore
  264.   } def
  265.  
  266. % t is one of the basic fish rearrangements
  267. /t { { p } { q } { r } { s } quartet } def
  268.  
  269. % u is another of the basic fish rearrangements
  270. /u { { q } 90 rot cycle } def
  271.  
  272. % display a level 2 fish
  273. .001 setlinewidth
  274. 0 setgray
  275. 60 150 translate
  276. 500 500 scale
  277. 2 2 fish
  278. showpage
  279.